<?php

namespace app\v4\controller;

use app\service\JwtService;
use app\service\WechatPayService;
use think\Db;
use think\facade\Log;

class Pay
{
    /**
     * 创建微信Native支付订单
     * 返回支付二维码URL
     */
    public function createOrder()
    {
        $result = [
            'code' => 0,
            'msg' => '',
            'data' => []
        ];
        
        // 验证用户登录
        $token = JwtService::getTokenFromHeader();
        if (!$token) {
            $result['code'] = 401;
            $result['msg'] = '请先登录';
            return json($result);
        }
        
        $payload = JwtService::verifyToken($token);
        if (!$payload) {
            $result['code'] = 401;
            $result['msg'] = '登录已过期，请重新登录';
            return json($result);
        }
        
        $userId = $payload['id'];
        
        // 获取订单参数
        $productId = input('product_id', 0, 'intval');
        $productType = input('product_type', ''); // once_nums, month_day, works_once_nums 等
        $amount = input('amount', 0, 'floatval');
        
        if (empty($productId) || empty($productType) || $amount <= 0) {
            $result['code'] = 1;
            $result['msg'] = '参数错误';
            return json($result);
        }
        
        // 生成商户订单号
        $outTradeNo = date('YmdHis') . mt_rand(1000, 9999) . $userId;
        
        // 订单标题
        $productTypeNames = [
            'once_nums' => '单次体验',
            'month_day' => '月卡体验',
            'works_once_nums' => '工作事业次卡',
            'works_month_nums' => '工作事业月卡',
            'emotion_once_nums' => '情感事业次卡',
            'emotion_month_nums' => '情感事业月卡',
            'pr_once_nums' => '公关审核次卡',
            'pr_month_nums' => '公关审核月卡',
            'group_once_nums' => '团体用户次卡',
            'group_month_nums' => '团体用户月卡',
            'stu_once_nums' => '学业考研次卡',
            'stu_month_nums' => '学业考研月卡',
            'medical_once_nums' => '中医诊断体验'
        ];
        
        $title = 'SpaceTime天纪云国学AI - ' . ($productTypeNames[$productType] ?? '会员充值');
        
        // 创建订单记录
        $orderData = [
            'user_id' => $userId,
            'product_id' => $productId,
            'product_type' => $productType,
            'amount' => $amount,
            'out_trade_no' => $outTradeNo,
            'status' => 0, // 0-未支付，1-已支付
            'create_time' => time(),
            'pay_time' => 0,
            'pay_type' => 'wechat'
        ];
        
        $orderId = Db::name('order')->insertGetId($orderData);
        if (!$orderId) {
            $result['code'] = 1;
            $result['msg'] = '订单创建失败';
            return json($result);
        }
        
        // 调用微信支付服务创建支付
        $wechatPay = new WechatPayService();
        $payResult = $wechatPay->createNativePayment($outTradeNo, $amount, $title, "product_type:{$productType}");
        
        if ($payResult['code'] !== 0) {
            // 支付创建失败，更新订单状态
            Db::name('order')->where(['id' => $orderId])->update(['status' => -1]);
            
            $result['code'] = 1;
            $result['msg'] = $payResult['msg'];
            return json($result);
        }
        
        // 返回支付二维码URL和订单信息
        $result['data'] = [
            'order_id' => $orderId,
            'out_trade_no' => $outTradeNo,
            'amount' => $amount,
            'code_url' => $payResult['data']['code_url'],
            'expire_time' => time() + 7200 // 二维码有效期2小时
        ];
        
        return json($result);
    }
    
    /**
     * 查询订单支付状态
     */
    public function queryOrder()
    {
        $result = [
            'code' => 0,
            'msg' => '',
            'data' => []
        ];
        
        $outTradeNo = input('out_trade_no', '');
        
        if (empty($outTradeNo)) {
            $result['code'] = 1;
            $result['msg'] = '订单号不能为空';
            return json($result);
        }
        
        // 查询本地订单
        $order = Db::name('order')->where(['out_trade_no' => $outTradeNo])->find();
        if (!$order) {
            $result['code'] = 1;
            $result['msg'] = '订单不存在';
            return json($result);
        }
        
        // 如果订单已支付，直接返回
        if ($order['status'] == 1) {
            $result['data'] = [
                'out_trade_no' => $outTradeNo,
                'paid' => true,
                'status' => 1
            ];
            return json($result);
        }
        
        // 调用微信支付接口查询订单状态
        $wechatPay = new WechatPayService();
        $queryResult = $wechatPay->queryOrder($outTradeNo);
        
        if ($queryResult['code'] !== 0) {
            $result['code'] = 1;
            $result['msg'] = $queryResult['msg'];
            return json($result);
        }
        
        // 如果订单已支付，更新本地订单状态
        if ($queryResult['data']['paid']) {
            // 更新订单状态
            Db::name('order')->where(['out_trade_no' => $outTradeNo])->update([
                'status' => 1,
                'pay_time' => time()
            ]);
            
            // 更新用户会员权益
            $this->updateUserMembership($order['user_id'], $order['product_type'], $order['product_id']);
        }
        
        $result['data'] = [
            'out_trade_no' => $outTradeNo,
            'paid' => $queryResult['data']['paid'],
            'status' => $queryResult['data']['paid'] ? 1 : 0,
            'trade_state' => $queryResult['data']['trade_state'],
            'trade_state_desc' => $queryResult['data']['trade_state_desc']
        ];
        
        return json($result);
    }
    
    /**
     * 微信支付回调通知
     * 该接口由微信支付服务器调用
     */
    public function notify()
    {
        // 接收微信支付通知数据
        $xmlData = file_get_contents('php://input');
        if (empty($xmlData)) {
            Log::write('微信支付回调通知：数据为空', 'error');
            return '<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[数据为空]]></return_msg></xml>';
        }
        
        // 解析XML数据
        libxml_disable_entity_loader(true);
        $data = json_decode(json_encode(simplexml_load_string($xmlData, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
        
        // 记录回调日志
        Log::write('微信支付回调通知：' . json_encode($data), 'info');
        
        // 验证支付结果
        if ($data['return_code'] !== 'SUCCESS' || $data['result_code'] !== 'SUCCESS') {
            Log::write('微信支付回调通知：支付失败', 'error');
            return '<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[支付失败]]></return_msg></xml>';
        }
        
        // 获取商户订单号
        $outTradeNo = $data['out_trade_no'];
        
        // 查询本地订单
        $order = Db::name('order')->where(['out_trade_no' => $outTradeNo])->find();
        if (!$order) {
            Log::write('微信支付回调通知：订单不存在', 'error');
            return '<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[订单不存在]]></return_msg></xml>';
        }
        
        // 如果订单已支付，直接返回成功
        if ($order['status'] == 1) {
            return '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
        }
        
        // 验证支付金额
        $totalFee = $data['total_fee'] / 100; // 微信支付金额单位为分
        if (abs($totalFee - $order['amount']) > 0.01) {
            Log::write('微信支付回调通知：支付金额不匹配', 'error');
            return '<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[支付金额不匹配]]></return_msg></xml>';
        }
        
        // 更新订单状态
        $updateResult = Db::name('order')->where(['out_trade_no' => $outTradeNo])->update([
            'status' => 1,
            'pay_time' => time()
        ]);
        
        if (!$updateResult) {
            Log::write('微信支付回调通知：订单状态更新失败', 'error');
            return '<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[订单状态更新失败]]></return_msg></xml>';
        }
        
        // 更新用户会员权益
        $this->updateUserMembership($order['user_id'], $order['product_type'], $order['product_id']);
        
        // 返回成功
        return '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
    }
    
    /**
     * 更新用户会员权益
     *
     * @param int $userId 用户ID
     * @param string $productType 产品类型
     * @param int $productId 产品ID
     * @return bool
     */
    private function updateUserMembership($userId, $productType, $productId)
    {
        // 查询用户
        $user = Db::name('member')->where(['id' => $userId])->find();
        if (!$user) {
            Log::write("更新用户会员权益失败：用户不存在，用户ID: {$userId}", 'error');
            return false;
        }
        
        // 查询产品
        $product = Db::name('product')->where(['id' => $productId])->find();
        if (!$product) {
            Log::write("更新用户会员权益失败：产品不存在，产品ID: {$productId}", 'error');
            return false;
        }
        
        // 根据产品类型更新用户权益
        $updateData = [];
        
        switch ($productType) {
            case 'once_nums':
                $updateData['once_nums'] = $user['once_nums'] + $product['nums'];
                break;
            case 'month_day':
                $updateData['month_day'] = $user['month_day'] + $product['days'];
                break;
            case 'works_once_nums':
                $updateData['works_once_nums'] = $user['works_once_nums'] + $product['nums'];
                break;
            case 'works_month_nums':
                $updateData['works_month_nums'] = $user['works_month_nums'] + $product['days'];
                break;
            case 'emotion_once_nums':
                $updateData['emotion_once_nums'] = $user['emotion_once_nums'] + $product['nums'];
                break;
            case 'emotion_month_nums':
                $updateData['emotion_month_nums'] = $user['emotion_month_nums'] + $product['days'];
                break;
            case 'pr_once_nums':
                $updateData['pr_once_nums'] = $user['pr_once_nums'] + $product['nums'];
                break;
            case 'pr_month_nums':
                $updateData['pr_month_nums'] = $user['pr_month_nums'] + $product['days'];
                break;
            case 'group_once_nums':
                $updateData['group_once_nums'] = $user['group_once_nums'] + $product['nums'];
                break;
            case 'group_month_nums':
                $updateData['group_month_nums'] = $user['group_month_nums'] + $product['days'];
                break;
            case 'stu_once_nums':
                $updateData['stu_once_nums'] = $user['stu_once_nums'] + $product['nums'];
                break;
            case 'stu_month_nums':
                $updateData['stu_month_nums'] = $user['stu_month_nums'] + $product['days'];
                break;
            case 'medical_once_nums':
                $updateData['medical_once_nums'] = $user['medical_once_nums'] + $product['nums'];
                break;
            default:
                Log::write("更新用户会员权益失败：未知产品类型，产品类型: {$productType}", 'error');
                return false;
        }
        
        // 更新用户权益
        $updateResult = Db::name('member')->where(['id' => $userId])->update($updateData);
        if (!$updateResult) {
            Log::write("更新用户会员权益失败：数据库更新失败，用户ID: {$userId}", 'error');
            return false;
        }
        
        return true;
    }
}
